%!TEX root = ../Manual.tex
\chapter{构建}
\section{算法概述}
\subsection{问题分析}
本文方法的目标是利用一组超高分辨率的航拍图像，使用3DGS完成大规模场景的重建工作。具体而言，本文方法需要应对输入图像分辨率急剧增高带来的显存问题，避免3DGS在训练过程中因显存占用超过GPU的显存上限，而导致训练失败。

在本文方法提出之前，已有多种针对使用3DGS进行大规模场景重建的方法问世，这些方法主要针对低分辨率的输入图像进行处理，主要解决的也是大规模场景重建需要大量高斯基元参与训练的问题。每个高斯基元都需要存储3阶球谐系数，协方差矩阵等多个属性，单个高斯基元需占用62个float大小的显存，且需要全程存储在GPU显存中，而重建大规模场景往往需要上千万的高斯基元。

为了解决这一问题，现有方法采取的策略是：在物体空间上将整个训练任务划分为多个子任务，减少单次训练时重建的范围，从而减少训练时所需要使用的高斯基元数量，最后再将这些子任务的训练结果进行合并，得到最终的重建结果。
具体而言，此类方法首先会经历3DGS的通用流程，即通过COLMAP估算各输入图像的相机位姿，并得到场景的稀疏初始点云（sparse point cloud, sfm）。随后，此类方法会对相机进行均分，形成一个个相机组，并将每组相机的边界作为物体空间上划分的子任务的边界，形成一个个区块。随后此类方法会为区块分配训练时需要使用的相机，空间位置在区块范围内的相机会被直接分配给对应区块，对于区块范围外的相机，此类方法则会计算区块范围内的sfm，在各相机视角下的投影面积，当投影面积大于指定阈值时，则会将该相机也分配给相应区块。

此类方法在低分辨率输入图像下行之有效，在高分辨率输入图像下则会遭遇明显的显存障碍。高分辨率输入图像下的场景重建往往需要将场景分割为空间范围更小的区块，此时单个相机视角下的可视范围，与区块的整体投影面积相比，可能会更大，而在训练过程中，各个相机视角皆采用输入图像分辨率创建多个计算张量，\textcolor{red}{补张图}，张量中只有一小部分在训练过程中实际被使用，这就导致了大量显存浪费，由于张量的分辨率较大，这种显存占用显得尤为严重。
尽管citygs系列方法优化了物体空间上的划分策略，选择先对整体场景进行一次低分辨率输入图像下的粗训练，以粗训练的结果作为物体空间下的区块划分依据，但这样的方法仍无法规避上述问题。

\subsection{解决思路}
为了解决上述问题，本文提出了一套双空间的子任务划分方法，将整体复杂的重建训练任务，拆分为一系列简单的训练任务。具体而言，本文方法在物体空间与图像空间上同时进行划分，将每个子任务都表示为\subtask。
值得注意的是，子任务在物体空间上的划分表示为(\subblock)，在图像空间上的划分则表示为(\subimage)。其中 $\mathbf{I}_{sub}=\{\mathcal{I}^i_{sub\}}$ ，即每个\ssubimage都是从高分辨率输入图像\image中提取出来的子图像。

为了更好的阐述子任务 \subtask 的概率，我们做出了如下2个分析：
\begin{itemize}
  \item 对于设计用于小规模场景的3DGS算法，任务划分是冗余的，因为GPU内存足够大，可以容纳所有的高斯基元以及一张全分辨率输入图像所需的张量。在这种情况下，训练过程仅包含一个任务，表示为$(\mathcal{G}_{sfm}, \mathbf{I})$，其中$\mathcal{G}_{sfm}$表示通过SfM生成的初始高斯基元集合，$\mathbf{I}$代表输入图像集合。
  
  \item 对于设计用于大规模场景的3DGS算法，通常仅在物体空间进行任务划分。例如，CityGS-v2\cite{liu2024citygaussianv2}使用物体空间中的等距间隔将场景划分为空间上不同的块，并在训练期间使用全分辨率图像。在这种情况下，原始的全尺度任务被分解为一组子任务$\{(\mathcal{G}^i_{block}, \mathbf{I})\}$。
\end{itemize}
大规模场景和超高分辨率输入图像对我们的方法施加了显著的内存限制。为了限制内存需求，每个子任务对 \subtask 必须满足以下不等式：
\begin{equation}
\mathbb{C}(\mathcal{G}{block}) + \max{\mathcal{I}{sub}^i \in \mathbf{I}{sub}}\mathbb{C}(\mathcal{I}^i_{sub}) \leq \mathbb{G}
\end{equation}
其中 $\mathbb{C}(\mathcal{G}_{block})$ 和 $\mathbb{C}(\mathcal{I}^i_{sub})$ 分别表示存储 \subblock 中的高斯基元和 \ssubimage 张量所需的内存消耗，$\mathbb{G}$ 表示GPU内存大小。
\subsection{算法流程}
为实现这一目标，构建 \subtask 的基本思路如下（如图\ref{fig:flowchart}所示）：

\begin{itemize}
  \item  \subblock 的构建：每个 \subblock 是通过均匀划分 \lowGS（从低分辨率图像重建的粗粒度3DGS表示）所占据的3D空间得到的（图\ref{fig:flowchart}中的\textcircled{1}）。然后将 \lowGS 中的所有高斯基元根据其3D位置分布到相应的 \subblock 分区中（图\ref{fig:flowchart}中的\textcircled{2}）。
  
  \item  \mask 的构建：\mask 是从相应 \subblock 构建 \ssubimage 的关键。它指示了 \subblock 在图像空间中的近似覆盖范围。为构建 \mask，我们首先通过将 \subblock 中的高斯基元投影到输入图像 \image 上来生成粗掩码 \coarsemask（图\ref{fig:flowchart}中的\textcircled{3}）。随后，采用基于深度比较的算法去除 \coarsemask 中的错误像素，得到 \mask（图\ref{fig:flowchart}中的\textcircled{4}）。
  
  \item  \subimage 的构建：基于 \mask，可以通过计算 \mask 的轴对齐边界框（AABB）轻松构建 \ssubimage（图\ref{fig:flowchart}中的\textcircled{5}）。
\end{itemize}
\section{构建 \subblock}
构建子任务的首要步骤就是构建 \subblock，不同于只有物体空间划分的子任务划分，本文构建 \subblock 需要满足如下条件：
\begin{itemize}
  \item 能够划分任意数量大小的区块。若要极大降低显存的消耗，则区块的大小会设置的比较小，区块的数量会增加，\subblock 的构建应保证无论划分多少区块，都不会对后续工作产生影响。
  \item 将区块投影到屏幕空间上后，能得到屏幕空间上的连续表达，而不是一个个离散的点，从而为后续通过 \subblock 得到 \subimage 做准备。
\end{itemize}
为了达成以上条件，本文方法摒弃了常规方法中直接根据sfm初始稀疏点云进行区块划分的模式，而是先进行一次针对整体场景的粗训练。为了确保粗训练时占用显存不会超过显存上限，本文方法在进行粗训练时，会大幅降低使用的输入图像分辨率和高斯基元致密化的频率，使得训练中高斯基元和计算张量的显存占用都维持在较低水准，只求得到场景的粗略表达。

在得到粗训练的结果后，本文方法按照空间位置等分区。由于通过粗训练重建出来的场景，其平面并不一定在xz轴所张成的平面平行，为了简化在物体空间上进行区块划分的难度，本文方法参考VastGS的做法，对粗训练的结果整体进行一个曼哈顿对齐，使场景的底面与xz平面平行，高则与y轴平行。

最后，本文方法根据设定好的区块数量，在xz平面上将粗训练重建结果按照空间位置进行均分，根据每个高斯基元的中心点所在位置，将其归入各个区块，最后每个区块内的所有高斯基元即形成\subblock

\subsection{构建 \mask}
\mask 在我们的算法中扮演以下两个重要角色：

\begin{itemize}
  \item 如前所述，\mask 将用于创建 \subimage；
  \item 更重要的是，在训练过程中，\mask 在定义损失函数方面起着关键作用，以防止在 \subblock 的 3D 单元域 $C$ 之外生成高斯基元（详见第 \ref{sec:loss_function} 节）。
\end{itemize}

从 \subblock 生成 \ssubimage 的一种直接方法是，将 \subblock 中的高斯基元投影到图像 \image 上，从而得到一个布尔掩码 \coarsemask，该掩码标记了投影结果所覆盖的像素。随后，可以将 \image 中真值区域的 AABB 作为 \ssubimage。

然而，这种策略存在问题，因为 \coarsemask 中的像素可能对应于不属于 \subblock 的高斯基元。这个问题主要源于以下两个方面（如图 \ref{fig:Multi-Block culling} 所示）：

\begin{itemize}
  \item \textit{过大的高斯基元：} 请注意，\subblock 是从 \lowGS 构建的，而 \lowGS 是从低分辨率图像重建的。它包含许多大尺寸的高斯基元，其投影在超高分辨率图像中可能会覆盖 \subblock 边界之外的过多像素。3DGS 固有的漂浮物伪影加剧了这个问题。如图 \ref{fig:Multi-Block culling} 所示，过大的 splat 的投影覆盖了像素 $p_C$，但显然我们不应将 $p_C$ 包含在 \subblock 的训练中。
  \item \textit{块间遮挡：} 生成 \coarsemask 时忽略了块之间的遮挡关系。尽管相邻块 $\mathcal{G}^i$ 和 $\mathcal{G}^j$ 在物体空间中是分离的，但它们在输入图像上的 2D 投影可能重叠。图 \ref{fig:Multi-Block culling} 以 2D 情况示说明了这一点。如果忽略 \subblock 的相邻块，像素 $p_A$ 会被 \subblock 中的高斯基元覆盖。然而，$p_A$ 的颜色显然是由其他某个块决定的。因此，应将 $p_A$ 从 \subblock 的训练中排除。
\end{itemize}

在本文中，我们提出了一种优化技术来细化 \coarsemask，从而得到更精确的掩码 \mask。为实现这一目标，我们选择 2D Gaussian \cite{huang20242d} 作为基础基元，因为 2DGS 能提供比 3DGS 更精确的深度缓冲。给定一个相当精确的深度缓冲，我们可以利用深度信息来识别被位于 \subblock 之外的高斯基元覆盖的像素。

在本文中，我们采用 \cite{huang20242d} 中的中值深度策略来定义逐像素深度 $d_p$，如公式 \ref{eq:depth} 所示：

\begin{equation}
  \label{eq:depth}
  d_p=\max\{z_i|T_i>0.5\}
\end{equation}
其中 $z_i$ 是第 $i$ 条光线与 splat 的交点的深度，$T_i$ 表示累积透明度。

获得 \mask 的基本思想是通过深度比较来确定像素 $p$ 的颜色是否主要由 \subblock 中的高斯基元贡献。深度比较涉及像素 $p$ 的以下两个深度值：1）从 \lowGS 渲染得到的深度值 $d_p$；2）仅渲染 \subblock 得到的深度值 $d_p^{block}$；

如图 \ref{fig:Multi-Block culling} 所示，给定这两个深度值，我们可以过滤掉 \coarsemask 中不应参与后续子任务训练的像素。

\begin{itemize}
  \item $d_p^{block} = d_p$： 在这种情况下，\subblock 和 \lowGS 产生的深度值相同，表明像素 $p$ 应包含在子任务 \subtask 的训练中（图 \ref{fig:Multi-Block culling} 中的像素 $p_B$ 展示了这种情况）；
  \item $d_p^{block} < d_p$： 这种情况表明 \subblock 中的高斯基元在 $p$ 点被其他块的高斯基元遮挡。因此，应将 $p$ 从 \subtask 的训练中排除（图 \ref{fig:Multi-Block culling} 中的像素 $p_A$ 展示了这种情况）；
  \item $d_p^{block} > d_p$： 这种情况是由于 \subblock 中存在过大的高斯基元造成的。它表明其他块的高斯基元对 $p$ 点的颜色贡献占主导。因此，$p$ 应被排除在 \subtask 的训练之外（图 \ref{fig:Multi-Block culling} 中的像素 $p_C$ 展示了这种情况）。
\end{itemize}

/textcolor{red}{放到最后说}通常情况下，划分区块的数量往往由使用者自行决定，但为了使显存占用更合理，避免因区块过小而导致大量显存未使用，延长训练时间，或是因区块过大而导致训练时显存占用超过容量上限。

\section{子任务划分}
\subsection{构建}
补上区块数自动计算
\section{实验设置}
\subsection{实验环境}
\subsection{对比算法设置}
\subsection{评价指标}
\section{结果与分析}
\subsection{训练过程中显存占用变化}
D1 1,2,4,9k  D2 1,2,4,9K
\subsection{定量实验与分析}
不同算法间显存对比，训练时间对比
\subsection{验证\mask的生成对于子任务划分的有效性}
是否生成\mask 对于最终\mask的影响（图片）
显存占用
不同参数对于 \mask 生成的影响（图片）
显存占用
\subsection{研究不同区块数对于子任务划分的影响}
不同区块划分的直观显示（把一坨坨高斯基元分割开来显示）
对显存的影响
\subsection{不同显存阈值下区块划分结果}
\subsection{不同参数设置下区块划分结果}
\subsection{不同参数设置对精确掩码生成结果的影响}
\subsection{是否进行精确掩码生成对实验结果的影响}
\subsection{本章小结}
\label{chap_Realization}
